package gomz.res;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementArray;

/**
 * @author Schatzmann
 * @author Murillo
 * Diese Klasse enthaelt alle Daten, welche sich auf eine Question/Fragestellung beziehen
 * Erbt von QuestionCore enthält also auch eine id und einen namen
 */

public class Question extends QuestionCore{
// ********************************************************************************
// Variablen
// ********************************************************************************
    @Element(required = false)
    private Date created = new Date();
    @Element(required = false)
    private String analysis = new String();
    @Element(required = false)
    private String feedback = new String();
    @ElementArray(required = false)
    private int[] lines = new int[6];	//Linienart [0] -> unterste Linie
    @ElementArray(required = false)
    private Hexagram[] hex = new Hexagram[12]; //Kontext, Perspektiv, Komplementaer, Wende, Nuklear, Fuxi, Linien 1-6
    @Element(required = false)
    private String synthesis = new String();

// ********************************************************************************
// Getter/Setter
// ********************************************************************************
    public String getAnalysis() {
        return analysis;
    }

    public void setAnalysis(String analysis) {
        this.analysis = analysis;
    }

    public String getFeedback() {
        return feedback;
    }

    public void setFeedback(String feedback) {
        this.feedback = feedback;
    }

    public int[] getLines() {
        return lines;
    }

    public void setLines(int[] lines) {
        this.lines = lines;
    }

    public Hexagram[] getHex() {
        return hex;
    }

    public void setHex(Hexagram[] hex) {
        this.hex = hex;
    }

    public String getSynthesis() {
        return synthesis;
    }

    public void setSynthesis(String synthesis) {
        this.synthesis = synthesis;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

// ********************************************************************************
// Konstruktor
// ********************************************************************************
    /**
     * Konstruktor um eine leere Question zu erstellen
     */
    public Question(){

    }
    

    /**
     * Konstruktor um eine Question direkt mit den daten zu fuellen
     * @param id ID der Question
     * @param isPublic ob die Frage für alle verfügbar ist
     * @param title  Titel der Question
     * @param question Frage der Question
     * @param analysis Analysis der Question
     * @param synthesis Synthese der Question
     * @param feedback Feedback der Question
     * @param lines 6 Zahlen der Lines | [0] unterste Linie
     * @param hex alle Hexagramme
     * @param cat Categories in welcher die Frage enthalten ist
     * @param user User welchem die Frage gehört
     */

    public Question(int id, boolean isPublic, String title, String question, String analysis, String synthesis, String feedback, int[] lines, Hexagram[] hex, ArrayList<Category> cat, UserCore user){
        super(id, title, question, cat, isPublic, user);
        this.analysis = analysis;
        this.synthesis = synthesis;
        this.feedback = feedback;
        this.lines = lines;
        this.hex = hex;
    }
    
// ********************************************************************************
// Methoden
// ********************************************************************************
	/**
	 * Diese Methode wandelt einen Array mit den Zahlen 6-9 in binaer um. Zeilen von unten nach oben.
         * @author Murillo
	 * @param lines int[] linien von 6-9
	 * @return binaere umgewandelte ID
	 */
	public int transformId(int[] lines){
		//Binaer 0 steht fuer Yang, 1 steht fuer Yin
		int tId = 0;
		for(int i = 0; i<6; i++){
			//6 altes Yin, 7 junges Yang, 8 junges Yin, 9 altes Yang
			switch (lines[i]){
				default:
					break;
				case 6:
					tId += (1 << i);
					break;
				case 7:
					//soll 0 bleiben
					break;
				case 8:
					tId += (1 << i);
					break;
					//soll 0 bleiben
				case 9:
					break;
			}
		}
		return (tId);
	}
	
	/**
         * @author Murillo
	 * Diese Methode berechnet aus den uebergebenen Lienien 6-9 die Linienhexagramme
	 * @param lines int[] linien von 6-9, wobei Index 0 der untersten Linie entspricht
	 * @return IDs der Linienhexgramme wobei Index 0 der untersten Linie entspricht
	 */
	public int[] getLineHexagramId(int[] lines){
		int[] lId = new int[lines.length];
		int[] tmpHexLines = new int[lines.length];
		for (int lineIndex = 0 ; lineIndex < lines.length; lineIndex++){
			System.arraycopy(lines, 0, tmpHexLines, 0, lines.length);
			switch(lines[lineIndex]){
				default:
					break;
				case 6:
					tmpHexLines[lineIndex] = 7;
					break;
				case 9:
					tmpHexLines[lineIndex] = 8;
					break;
			}
			lId[lineIndex] = transformId(tmpHexLines);
		}
		
		return(lId);
	}

	/**
         * @author Murillo
	 * Diese Methode berechnet aus den uebergebenen Lienien 6-9 das Perspektivhexagramm
	 * @param lines int[] linien von 6-9, wobei Index 0 der untersten Linie entspricht
	 * @return ID des Perspektivhexagramms
	 */
	public int getPerspektivHexagramId(int[] lines){
		int pId = 0;
		int[] tmpHexLines = new int[6];

		for (int lineIndex = 0 ; lineIndex < lines.length; lineIndex++){
			switch(lines[lineIndex]){
				default:
					tmpHexLines[lineIndex] = lines[lineIndex];
					break;
				case 6:
					tmpHexLines[lineIndex] = 7;
					break;
				case 9:
					tmpHexLines[lineIndex] = 8;
					break;
			}
			pId = transformId(tmpHexLines);
		}
		
		return (pId);
	}
        /**
         * @author Murillo
         * @return String mit dem Formatierten CreateDate
         */
	public String getCreateDateFormated(){
		SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
		return (df.format(created));
	}
}
